 /*******************************************************************************
  * Copyright (c) 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  ******************************************************************************/

 package org.eclipse.ui.internal.quickaccess;

 import java.util.ArrayList ;
 import java.util.List ;

 /**
  * Utility methods for camel case style matching.
  *
  * @since 3.3
  *
  */
 public class CamelUtil {

     /**
      * Returns a lowercase string consisting of all initials of the words in the
      * given String. Words are separated by whitespace and other special
      * characters, or by uppercase letters in a word like CamelCase.
      *
      * @param s
      * the string
      * @return a lowercase string containing the first character of every wordin
      * the given string.
      */
     public static String getCamelCase(String s) {
         StringBuffer result = new StringBuffer ();
         if (s.length() > 0) {
             int index = 0;
             while (index != -1) {
                 result.append(s.charAt(index));
                 index = getNextCamelIndex(s, index + 1);
             }
         }
         return result.toString().toLowerCase();
     }

     /**
      * Return an array with start/end indices for the characters used for camel
      * case matching, ignoring the first (start) many camel case characters.
      * For example, getCamelCaseIndices("some CamelCase", 1, 2) will return
      * {{5,5},{10,10}}.
      *
      * @param s the source string
      * @param start how many characters of getCamelCase(s) should be ignored
      * @param length for how many characters should indices be returned
      * @return an array of length start
      */
     public static int[][] getCamelCaseIndices(String s, int start, int length) {
         List result = new ArrayList ();
         int index = 0;
         while (start > 0) {
             index = getNextCamelIndex(s, index + 1);
             start--;
         }
         while (length > 0) {
             result.add(new int[] { index, index });
             index = getNextCamelIndex(s, index + 1);
             length--;
         }
         return (int[][]) result.toArray(new int[result.size()][]);
     }

     /**
      * Returns the next index to be used for camel case matching.
      *
      * @param s the string
      * @param index the index
      * @return the next index, or -1 if not found
      */
     public static int getNextCamelIndex(String s, int index) {
         char c;
         while (index < s.length()
                 && !(isSeparatorForCamelCase(c = s.charAt(index)))
                 && Character.isLowerCase(c)) {
             index++;
         }
         while (index < s.length() && isSeparatorForCamelCase(c = s.charAt(index))) {
             index++;
         }
         if (index >= s.length()) {
             index = -1;
         }
         return index;
     }

     /**
      * Returns true if the given character is to be considered a separator
      * for camel case matching purposes.
      *
      * @param c the character
      * @return true if the character is a separator
      */
     public static boolean isSeparatorForCamelCase(char c) {
         return !Character.isLetterOrDigit(c);
     }

 }

